/*
    封装实现一个SqliteHelper类，提供简单的sqlite数据库操作接口，完成数据的基础增删查改操作。
        1. 创建/打开数据库文件
        2. 针对打开的数据库执行操作
            1. 表的操作
            2. 数据的操作
        3.关闭数据库
*/
#include<iostream>
#include<string>
#include<vector>
#include<sqlite3.h>

class SqliteHelper {
    public:
        typedef int(*SqliteCallback)(void*,int,char**,char**);
        SqliteHelper(const std::string &dbfile) : _dbfile(dbfile), _handler(nullptr){}
        bool open(int safe_leve = SQLITE_OPEN_FULLMUTEX){//传入安全等级
            int ret=sqlite3_open_v2(_dbfile.c_str(), &_handler, SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE | safe_leve, nullptr);
            if (ret != SQLITE_OK){
                std::cout << "创建/打开sqlite数据库失败：";
                std::cout << sqlite3_errmsg(_handler) << std::endl;
                return false;
            }
            else return true;
        }
        bool exec(const std::string &sql, SqliteCallback cb, void *arg) { //cb回调函数：执行这条语句后对结果的处理是怎样的？arg sql语句执行的结果，传到回调函数里用来拿到结果，是输出型.
            int ret=sqlite3_exec(_handler, sql.c_str(), cb, arg, nullptr);
            if(ret != SQLITE_OK){
                std::cout << sql << std::endl;
                std::cout << "执行语句失败：";
                std::cout << sqlite3_errmsg(_handler) << std::endl;
                return false;
            }
            else return true;

        }
        void close(){
            if(_handler) sqlite3_close_v2(_handler);
        }
    private:
        std::string _dbfile;
        sqlite3* _handler;//句柄
};